﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;

namespace Shumisen.Web.Form.Modules
{
	// TODO Pageに属性をつけてダブルサブミットのチェックを行わないことを指定できるようにする。
	// TODO トークンの出力
	// TODO クライアントサイドのJavaScriptの実装
	public class AntiDoubleSubmitModule : IHttpModule
	{
		public void Init(HttpApplication context)
		{
			throw new NotImplementedException();
		}

		public void Dispose()
		{
			throw new NotImplementedException();
		}

		protected virtual void OnPreRequestHandlerExecute(Object sender, EventArgs e)
		{
			var context = HttpContext.Current;
			var page = context.Handler as Page;
			if (page == null)
			{
				return;
			}
			page.Load += OnLoad;
			page.PreRender += OnPreRender;
		}


		protected virtual void OnLoad(Object sender, EventArgs e)
		{
			var page = (Page)sender;
			if (page.IsCallback)
			{


				// TODO 適切な例外
				throw new InvalidOperationException("double submit");
			}
		}

		protected virtual void OnPreRender(Object sender, EventArgs e)
		{
			var page = sender as Page;
			if (page == null || page.Form == null)
			{
				return;
			}
			// TODO シリアライズの必要性と方法の検討
			//var stateFormatter = new ObjectStateFormatter();
			//page.ClientScript.RegisterHiddenField(HiddenFieldNames.CsrfToken, stateFormatter.Serialize(csrfToken));
		}
	}
}
